//=============================================================================
// File      : utilities.h
// Created   : mar jun 19 13:18:14 CEST 2001
// Author    : Antoine YESSAYAN, Paul RASCLE, EDF
// Project   : SALOME
// Copyright : EDF 2001
// $Header$
//=============================================================================

/* ---  Definition macros file to print information if _DEBUG_ is defined --- */

#ifndef UTILITIES_H
#define UTILITIES_H

#include <stdlib.h>
// # include <iostream> ok for gcc3.01
#include <iostream>

/* ---  INFOS is always defined (without _DEBUG_): to be used for warnings, with release version --- */

#define HEREWEARE                                                                                                      \
	cout << flush;                                                                                                     \
	cerr << __FILE__ << " [" << __LINE__ << "] : " << flush;
#define INFOS(chain)                                                                                                   \
	{                                                                                                                  \
		HEREWEARE;                                                                                                     \
		cerr << chain << endl;                                                                                         \
	}
#define PYSCRIPT(chain)                                                                                                \
	{                                                                                                                  \
		cout << flush;                                                                                                 \
		cerr << "---PYSCRIPT--- " << chain << endl;                                                                    \
	}

/* --- To print date and time of compilation of current source on stdout --- */

#if defined(__GNUC__)
#define COMPILER "g++";
#elif defined(__sun)
#define COMPILER "CC";
#elif defined(__KCC)
#define COMPILER "KCC";
#elif defined(__PGI)
#define COMPILER "pgCC";
#else
#define COMPILER "undefined";
#endif

#ifdef INFOS_COMPILATION
#error INFOS_COMPILATION already defined
#endif
#define INFOS_COMPILATION                                                                                              \
	{                                                                                                                  \
		cerr << flush;                                                                                                 \
		cout << __FILE__;                                                                                              \
		cout << " [" << __LINE__ << "] : ";                                                                            \
		cout << "COMPILED with " << COMPILER;                                                                          \
		cout << ", " << __DATE__;                                                                                      \
		cout << " at " << __TIME__ << endl;                                                                            \
		cout << "\n\n";                                                                                                \
		cout << flush;                                                                                                 \
	}

#ifdef _DEBUG_

/* --- the following MACROS are useful at debug time --- */

#define HERE                                                                                                           \
	cout << flush;                                                                                                     \
	cerr << "- Trace " << __FILE__ << " [" << __LINE__ << "] : " << flush;
#define SCRUTE(var)                                                                                                    \
	HERE;                                                                                                              \
	cerr << #var << "=" << var << endl;
#define MESSAGE(chain)                                                                                                 \
	{                                                                                                                  \
		HERE;                                                                                                          \
		cerr << chain << endl;                                                                                         \
	}
#define INTERRUPTION(code)                                                                                             \
	HERE;                                                                                                              \
	cerr << "INTERRUPTION return code= " << code << endl;                                                              \
	exit(code);

#ifndef ASSERT
#define ASSERT(condition)                                                                                              \
	if (!(condition)) {                                                                                                \
		HERE;                                                                                                          \
		cerr << "CONDITION " << #condition << " NOT VERIFIED" << endl;                                                 \
		INTERRUPTION(1);                                                                                               \
	}
#endif /* ASSERT */

#define REPERE                                                                                                         \
	cout << flush;                                                                                                     \
	cerr << "   --------------" << endl << flush;
#define BEGIN_OF(chain)                                                                                                \
	{                                                                                                                  \
		REPERE;                                                                                                        \
		HERE;                                                                                                          \
		cerr << "Begin of: " << chain << endl;                                                                         \
		REPERE;                                                                                                        \
	}
#define END_OF(chain)                                                                                                  \
	{                                                                                                                  \
		REPERE;                                                                                                        \
		HERE;                                                                                                          \
		cerr << "Normal end of: " << chain << endl;                                                                    \
		REPERE;                                                                                                        \
	}

#else /* ifdef _DEBUG_*/

#define HERE
#define SCRUTE(var)
#define MESSAGE(chain)
#define INTERRUPTION(code)

#ifndef ASSERT
#define ASSERT(condition)
#endif /* ASSERT */

#define REPERE
#define BEGIN_OF(chain)
#define END_OF(chain)

#endif /* ifdef _DEBUG_*/

#endif /* ifndef UTILITIES_H */
